<?php
/*    phpnubox Copyright Buscalibre.com
 *    This file is part of phpnubox.
 *
 *    phpnubox is free software: you can redistribute it and/or modify
 *    it under the terms of the GNU General Public License as published by
 *    the Free Software Foundation, either version 3 of the License, or
 *    (at your option) any later version.
 *
 *    phpnubox is distributed in the hope that it will be useful,
 *    but WITHOUT ANY WARRANTY; without even the implied warranty of
 *    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *    GNU General Public License for more details.
 *
 *    You should have received a copy of the GNU General Public License
 *    along with phpnubox.  If not, see <http://www.gnu.org/licenses/>. 
 */

class NuboxUrlProd {
    //Complete las URLS Entregadas por Nubox
    const AUTENTICADOR_END_POINT_URL = "";
    const CARGARYEMITIR_END_POINT_URL = "";
    const OBTENERPDF_END_POINT_URL = "";

}

class NuboxUrlCert {
    //Complete las URLS Entregadas por Nubox
    const AUTENTICADOR_END_POINT_URL = "";
    const CARGARYEMITIR_END_POINT_URL = "";
    const OBTENERPDF_END_POINT_URL = "";

}

class NuboxAutenticar {

    const SISTEMA_CERTIFICADO = 1;
    const SISTEMA_PRODUCCION = 2;

}

class NuboxCargarEmitir {

    const FOLIOS_ARCHIVO = 0;
    const FOLIOS_SISTEMA = 1;
    const RUT_CLI_EX_ARCHIVO = 1;
    const RUT_CLI_EX_ARCHIVO_EX_MAIL = 2;
    const RUT_CLI_EX_NO = 0;
    const RUT_CLI_NOEX_AGREGAR = 1;
    const RUT_CLI_NOEX_DETENER = 0;

}

class NuboxUtils {
    public static function arrayToString(array $csv_arr) {
        $csv_str = "";
        foreach($csv_arr as $index_item) {
            $csv_str .= implode(";",$index_item).PHP_EOL;
        }
        
        if($csv_str == "") {
            return false;
        }
        else {
            return $csv_str;
        }
    }
}

//-------------------------BEGIN CODIGOS DOCUMENTOS

    class NuboxCsvCodeDocumentoTipo {
        const FACTURA_ELECTRONICA = 33;
        const FACTURA_ELECTRONICA_EXENTA = 34;
        const NOTA_DE_DEBITO_ELECTRONICA = 56;
        const NOTA_DE_CREDITO_ELECTRONICA = 61;
    }

    class NuboxCsvCodeTipoDocumentoReferenciado {
        const FACTURA = 30; //30: Factura
        const FACTURA_ELECTRONICA = 33; //33: Factura electronica
        const FACTURA_ELECTRONICA_EXENTA = 34;//34:Factura electronica exenta
        const BOLETA_ELECTRONICA = 39; //39: Boleta Electronica
        const BOLETA_ELECTRONICA_EXENTA = 41; //41: Boleta Electronica Exenta
        const FACTURA_DE_COMPRA = 45;//45: Factura de Compra
        const FACTURA_DE_COMPRA_ELECTRONICA = 46;//46: Factura de Compra Electronica
        const GUIA_DE_DESPACHO = 50;//50: Guia de Despacho
        const GUIA_DE_DESPACHO_ELECTRONICA = 52;//52: Guia de despacho electronica
        const NOTA_DEBITO_ELECTRONICA = 56;//56: Nota debito electronica
        const NOTA_DE_CREDITO_ELECTRONICA = 61;//61:Nota de credito electronica
        const LIQUIDACION = 103;//103:Liquidacion
        const ORDEN_DE_COMPRA = 801;//801: Orden de Compra
        const NOTA_DE_PEDIDO = 802;//802: Nota de Pedido
    }

    class NuboxCsvCodeMotivoReferencia {
        const ANULA_DOCUMENTO = 1;//1: Anula documento
        const CORRIGE_TEXTO = 2;//2: Corrige texto
        const CORRIGE_MONTO = 3;//3: Corrige monto
    }

    class NuboxCsvCodeUnidadMedia {
        const HR = "HR";
        const KG = "KG";
        const M3 = "M3";
        const MR = "MR";
        const PM = "PM";
        const PP = "PP";
        const QTAL = "QTAL";
        const TBDM = "TBDM";
        const TBDU = "TBDU";
        const TON = "TON";
        const UNID = "UNID";
    }

    class NuboxCsvCodeIndicadorTraslado {
        const OPERACION_CONSTITUYE_VENTA = 1;//1:Operacion constituye venta
        const VENTAS_POR_EFECTUAR = 2;//2:Ventas por efectuar
        const CONSIGNACIONES = 3;//3:Consignaciones
        const ENTREGA_GRATUITA = 4;//4:Entrega gratuita
        const TRASLADOS_INTERNOS = 5;//5:Traslados internos
        const OTROS_TRASLADOS_NO_VENTA = 6;//6:Otros traslados no venta
        const GUIA_DE_DEVOLUCION = 7;//7:Guia de devolucion
    }

    class NuboxCsvCodeFormaPago {
        const CONTADO = 1;//1:Contado
        const CREADITO = 2;//2:Credito
        const SIN_COSTO = 3;//3:Sin costo
    }

    class NuboxCsvCodeMedioPago {
        const CHEQUE = "CH";//CH:Cheque
        const CHEQUE_A_FECHA = "CF";//CF:Cheque a fecha
        const LETRA = "LT";//LT:letra
        const EFECTIVO = "EF";//EF:Efectivo
        const PAGO_A_CUENTA_CORRIENTE = "PE";//PE:Pago a cta.cte
        const TARJETA_CREDITO = "TC";//TC:Tarjeta Credito
        const OTRO = "OT";//OT:Otro
    }

    class NubocCodeTipoServicio {
        const BOLETA_SERVICIO_PERIODICO = 1;
        const FACTURA_SERVICIO_PERIODICO_DOMICILIARIO = 1;//1: Boletas de servicios periódico Facturas de servicios periódicos domiciliarios
        const BOLETA_SERVICIO_PERIODICO_DOMICILIARIO = 2;
        const FACTURA_DE_OTROS_SERVICIOS_PERIODICOS = 2;//2:Boletas de servicios periódicos domiciliarios Facturas de otros servicios periódicos
        const BOLETA_DE_VENTAS_Y_SERVICIOS = 3;
        const FACTURA_DE_SERVICIOS = 3;//3:Boletas de venta y servicios Factura de servicios
    }

//-------------------------END CODIGOS DOCUMENTOS

class Nubox {
    const N_SERIE = 1;
    private $token = "";

    function __construct() {
        
    }

    public function autenticar($rutCliente, $rutUsuario, $contrasena, $sistema,$url) {
        $soap = new SoapClient($url);
        
        $params = array(
            'rutCliente' => $rutCliente,
            'rutUsuario' => $rutUsuario,
            'contrasena' => $contrasena,
            'sistema' => $sistema,
            'numeroSerie' => Nubox::N_SERIE,
        );
        
        $foo = $soap->Autenticar($params);
        $this->token = $foo->AutenticarResult;
        return $this->token;
    }

    public function cargaryEmitir($archivo, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste,$url) {
        $soap = new SoapClient($url);
        
        $params = array(
            'token' => $this->token,
            'archivo' => $archivo,
            'opcionFolios' => $opcionFolios,
            'opcionRutClienteExiste' => $opcionRutClienteExiste,
            'opcionRutClienteNoExiste' => $opcionRutClienteNoExiste,
        );
        
        $result = $soap->CargarYEmitir($params);
        $code_result = $result->CargarYEmitirResult->any;
        
        $result_xml = simplexml_load_string("<?xml version='1.0'?>".$code_result);
        if($result_xml->Resultado == "OK") {
            return $result_xml;
        }
        else {
            return $result_xml;
        }
    }
    
        public function cargaryEmitir2($archivo,$archivoReferencia, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste,$url) {
        $soap = new SoapClient($url);
        
        $params = array(
            'token' => $this->token,
            'archivo' => $archivo,
            'archivoReferencias' => $archivoReferencia,
            'opcionFolios' => $opcionFolios,
            'opcionRutClienteExiste' => $opcionRutClienteExiste,
            'opcionRutClienteNoExiste' => $opcionRutClienteNoExiste,
        );
        
        $result = $soap->CargarYEmitir2($params);
        
        $code_result = $result->CargarYEmitir2Result->any;
        
        $result_xml = simplexml_load_string("<?xml version='1.0'?>".$code_result);
        if($result_xml->Resultado == "OK") {
            return $result_xml;
        }
        else {
            return $result_xml;
        }
    }

    public function ObtenerPDF($identificadorArchivo,$url) {
        $soap = new SoapClient($url);

        $params = array(
            'token' => $this->token,
            'identificadorArchivo' => $identificadorArchivo
        );

        $pdf = $soap->ObtenerPDF($params);
        return $pdf->ObtenerPDFResult;
    }
    
    public function PrintPDF($identificadorArchivo,$url) {
        $soap = new SoapClient($url);

        $params = array(
            'token' => $this->token,
            'identificadorArchivo' => $identificadorArchivo
        );

        $pdf = $soap->ObtenerPDF($params);
        header("Content-type:application/pdf");
        echo $pdf->ObtenerPDFResult;
    }

}

class NuboxProd extends Nubox {
    function __construct() {
        
    }

    public function autenticar($rutCliente, $rutUsuario, $contrasena) {
        return Nubox::autenticar($rutCliente, $rutUsuario, $contrasena,NuboxAutenticar::SISTEMA_PRODUCCION,NuboxUrlProd::AUTENTICADOR_END_POINT_URL);
    }

    public function cargaryEmitir($archivo, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste) {
        return Nubox::cargaryEmitir($archivo, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste
                                    ,NuboxUrlProd::CARGARYEMITIR_END_POINT_URL);
    }

    public function cargaryEmitir2($archivo,$archivo_refer, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste) {
        return Nubox::cargaryEmitir2($archivo,$archivo_refer, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste
                                    ,NuboxUrlProd::CARGARYEMITIR_END_POINT_URL);
    }
    
    public function ObtenerPDF($identificadorArchivo) {
        return Nubox::ObtenerPDF($identificadorArchivo,NuboxUrlProd::OBTENERPDF_END_POINT_URL);
    }
    
    public function PrintPDF($identificadorArchivo) {
        return Nubox::PrintPDF($identificadorArchivo,NuboxUrlProd::OBTENERPDF_END_POINT_URL);
    }
    
}

class NuboxCert extends Nubox {
    function __construct() {
        
    }

    public function autenticar($rutCliente, $rutUsuario, $contrasena) {
        return Nubox::autenticar($rutCliente, $rutUsuario, $contrasena, NuboxAutenticar::SISTEMA_CERTIFICADO,NuboxUrlCert::AUTENTICADOR_END_POINT_URL);
    }

    public function cargaryEmitir($archivo, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste) {
        return Nubox::cargaryEmitir($archivo, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste
                                    ,NuboxUrlCert::CARGARYEMITIR_END_POINT_URL);
    }

    public function cargaryEmitir2($archivo,$archivo_refer, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste) {
        return Nubox::cargaryEmitir2($archivo,$archivo_refer, $opcionFolios, $opcionRutClienteExiste, $opcionRutClienteNoExiste
                                    ,NuboxUrlCert::CARGARYEMITIR_END_POINT_URL);
    }
    
    public function ObtenerPDF($identificadorArchivo) {
        return Nubox::ObtenerPDF($identificadorArchivo,NuboxUrlCert::OBTENERPDF_END_POINT_URL);
    }
    
    public function PrintPDF($identificadorArchivo) {
        return Nubox::PrintPDF($identificadorArchivo,NuboxUrlCert::OBTENERPDF_END_POINT_URL);
    }

}

?>
